import uuid
from flask import request, session, has_request_context
from logger_config import get_logger

logger = get_logger(__name__)

def get_session_id():
    """获取或生成会话ID
    
    Returns:
        会话ID字符串
    """
    # 检查是否在请求上下文中
    if not has_request_context():
        return str(uuid.uuid4())
    
    # 优先从Flask session中获取现有的session_id
    session_id = session.get('session_id')
    if session_id:
        logger.info(f"使用现有的session_id: {session_id}")
        return session_id
    
    # 如果没有现有session_id，则生成新的并存储
    new_session_id = str(uuid.uuid4())
    session['session_id'] = new_session_id
    logger.info(f"生成并存储新的session_id: {new_session_id}")
    return new_session_id

def get_or_create_session_id():
    """获取或创建会话ID，优先从session中获取
    
    Returns:
        会话ID字符串
    """
    # 直接调用get_session_id()，因为它已经包含了获取和创建的完整逻辑
    return get_session_id()

def update_session_info(session_id, llm_model, data_path, api_key, base_url):
    """更新会话信息
    
    Args:
        session_id: 会话ID
        llm_model: 使用的LLM模型
        data_path: 数据路径
        api_key: API密钥
        base_url: API基础URL
    """
    # 检查是否在请求上下文中
    if not has_request_context():
        logger.info(f"跳过会话信息更新（无请求上下文），模型: {llm_model}，会话ID: {session_id}")
        return
    
    session['session_id'] = session_id
    session['last_llm_model'] = llm_model
    session['last_data_path'] = data_path
    session['last_api_key'] = api_key
    session['last_base_url'] = base_url
    
    logger.info(f"会话信息已更新，模型: {llm_model}，会话ID: {session_id}")

def clear_session():
    """清除会话信息"""
    # 检查是否在请求上下文中
    if not has_request_context():
        logger.info("跳过会话清除（无请求上下文）")
        return
    
    session.clear()
    logger.info("会话信息已清除")

def get_session_info():
    """获取当前会话信息
    
    Returns:
        包含会话信息的字典
    """
    # 检查是否在请求上下文中
    if not has_request_context():
        return {
            'session_id': None,
            'last_llm_model': None,
            'last_data_path': None,
            'last_api_key': None,
            'last_base_url': None
        }
    
    return {
        'session_id': session.get('session_id'),
        'last_llm_model': session.get('last_llm_model'),
        'last_data_path': session.get('last_data_path'),
        'last_api_key': session.get('last_api_key'),
        'last_base_url': session.get('last_base_url')
    }

def is_session_initialized():
    """检查会话是否已初始化
    
    Returns:
        布尔值，表示会话是否已初始化
    """
    # 检查是否在请求上下文中
    if not has_request_context():
        return False
    
    return bool(session.get('session_id') and session.get('last_llm_model'))